/*******************************************************************************
  * 文件：KeyCheck.h
  * 作者：zyz
  * 版本：v1.0.0
  * 日期：2017-08-03
  * 说明：按键检测
*******************************************************************************/
#ifndef __KEY_CHECK_H
#define __KEY_CHECK_H

/* 头文件 *********************************************************************/
#include "Typedefine.h"
#include "Constant.h"

/* 宏定义 *********************************************************************/
#define u16KEY_CHECK_TIME_MSEC              ((U16)  10)    // 按键检测时间（毫秒）
#define u16KEY_PRESS_TIME_MIN               ((U16)   3)    // 最小短按时间
#define u16KEY_PRESS_TIME_MAX               ((U16) 120)    // 最大短按时间
#define u16KEY_CONTINUE_TIME                ((U16) 150)    // 连按启动时间
#define u16KEY_CONTINUE_STEP_200MS          ((U16)  20)    // 连按步长时间,200MS
#define u16KEY_CONTINUE_STEP_100MS          ((U16)  10)    // 连按步长时间,100MS
#define u16KEY_CONTINUE_STEP_50MS           ((U16)   5)    // 连按步长时间,50MS
#define u16KEY_HOLD_500MS_TIME              ((U16)  50)    // 长按0.5s时间
#define u16KEY_HOLD_1000MS_TIME             ((U16) 100)    // 长按1.0s时间
#define u16KEY_HOLD_1500MS_TIME             ((U16) 150)    // 长按1.5s时间
#define u16KEY_HOLD_2S_TIME                 ((U16) 200)    // 长按2s时间
#define u16KEY_HOLD_3S_TIME                 ((U16) 300)    // 长按3s时间
#define u16KEY_HOLD_5S_TIME                 ((U16) 500)    // 长按5s时间
#define u16KEY_HOLD_10S_TIME                ((U16)1000)    // 长按10S时间

// 键值
#define u32KEY_VALUE_NONE                    ((U32) 0x00000000)     // 无按键按下
#define u32KEY_VALUE_POWER                   ((U32) 0x00020000)     // 电源键按下
#define u32KEY_VALUE_WARM                    ((U32) 0x00040000)     // Warm键按下
#define u32KEY_VALUE_BOOST                   ((U32) 0x00080000)     // Boost加热键按下
#define u32KEY_VALUE_PAUSE                   ((U32) 0x00010000)     // Pause键按下
#define u32KEY_VALUE_HOB1                    ((U32) 0x00000008)     // Hob1键按下
#define u32KEY_VALUE_HOB2                    ((U32) 0x00000004)     // Hob2键按下
#define u32KEY_VALUE_HOB3                    ((U32) 0x00100000)     // Hob3键按下
#define u32KEY_VALUE_HOB4                    ((U32) 0x00008000)     // Hob4键按下
#define u32KEY_VALUE_ADD                     ((U32) 0x00000001)     // 加键按下
#define u32KEY_VALUE_SUB                     ((U32) 0x00000002)     // 减键按下
#define u32KEY_VALUE_ADD_SUB                 ((U32) 0x00000003)     // 加+减组合键按下

#define u32KEY_VALUE_S1                      ((U32) 0x00000010)     // S1键按下  
#define u32KEY_VALUE_S2                      ((U32) 0x00000020)     // S2键按下  
#define u32KEY_VALUE_S3                      ((U32) 0x00000040)     // S3键按下  
#define u32KEY_VALUE_S4                      ((U32) 0x00000080)     // S4键按下  
#define u32KEY_VALUE_S5                      ((U32) 0x00000400)     // S5键按下  
#define u32KEY_VALUE_S6                      ((U32) 0x00000800)     // S6键按下  
#define u32KEY_VALUE_S7                      ((U32) 0x00001000)     // S7键按下  
#define u32KEY_VALUE_S8                      ((U32) 0x00002000)     // S8键按下 
#define u32KEY_VALUE_S9                      ((U32) 0x00004000)     // S9键按下

#define u32KEY_VALUE_S1_S2                   ((U32) 0x00000030)     // S1+S2键按下  
#define u32KEY_VALUE_S2_S3                   ((U32) 0x00000060)     // S2+S3键按下  
#define u32KEY_VALUE_S3_S4                   ((U32) 0x000000C0)     // S3+S4键按下  
#define u32KEY_VALUE_S4_S5                   ((U32) 0x00000480)     // S4+S5键按下  
#define u32KEY_VALUE_S5_S6                   ((U32) 0x00000C00)     // S5+S6键按下  
#define u32KEY_VALUE_S6_S7                   ((U32) 0x00001800)     // S6+S7键按下  
#define u32KEY_VALUE_S7_S8                   ((U32) 0x00003000)     // S7+S8键按下  
#define u32KEY_VALUE_S8_S9                   ((U32) 0x00006000)     // S8+S9键按下  


/* 类型定义 *******************************************************************/
// 操作类型
typedef enum
{
    eKEY_TYPE_PRESS_DOWN,  // 按下
    eKEY_TYPE_PRESS_UP,    // 抬起
    eKEY_TYPE_CONTINUE,    // 连按
    eKEY_TYPE_HOLD_500MS,  // 长按500ms
    eKEY_TYPE_HOLD_1000MS, // 长按1000ms
    eKEY_TYPE_HOLD_1500MS, // 长按1500ms
    eKEY_TYPE_HOLD_2S,     // 长按2s
    eKEY_TYPE_HOLD_3S,     // 长按3s
    eKEY_TYPE_HOLD_5S,     // 长按5s
    eKEY_TYPE_HOLD_10S,    // 长按10S
} KeyType_te;

// 按键检测
typedef struct
{
    U32  u32CurrentKeyValue;     // 当前按键值
    U32  u32LastKeyValue;        // 上次按键值
    U16  u16TimeCount;           // 时间计时
    Bool bValidOperation;        // 有效操作
} KeyCheck_ts;

/* 变量声明 *******************************************************************/
/* 函数声明 *******************************************************************/
void Key_Init(void);     // 初始化按键
void Key_Check(void);    // 按键检测

#endif  /*** #ifndef __KEY_CHECK_H ***/

/***************************** 文件结束 ***************************************/

